<?php
/**
 * @author        Supfire<faithsmine@gmail.com>
 * @copyright     ourMy.com
 * @version       1.3
 * @name          db.class.php
 * @todo          Define the common database class, based on MYSQL 
 * @final         2008-08-13
 */

!defined("IN_YCTOOL") && exit();
/**
 * 一个简单易用的数据库类，基于MYSQL数据库类库
 *  相应的配置信息从配置文件中读取，(目前为：../config.php)
 */
class db
{
    /**
     * db - class的构造函数，主要是初始化数据库会话
     * 
     */
    private function __construct()
    {
    }
    
    private static $link = NULL;

    /**
     * 开启连接数据池
     * @return 连接Mysql的池 (mysql_select_db) 
     */
    private static function &db()
    {
	if (self::$link)
	{
	    return self::$link;
	}
	if (DB_PCONNECT)
	{
	    self::$link = mysql_pconnect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD);
	}
	else
	{
	    self::$link = mysql_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD);
	}
	if (!self::$link)
	{
	    die("Can't use database: " . mysql_error());
	}
	self::query("SET NAMES '".str_replace('-', '', CHARSET)."'", self::$link);
	mysql_select_db(DB_DATABASE, self::$link);
	return  self::$link;
    }

    /**
     * 结束连接数据池
     * @return NULL
     */
    public function __destruct()
    {
	self::close();
    }

    /**
     * 结束连接数据池
     * @return NULL
     */
    public static function close()
    {
	if (self::$link)
	{
	    mysql_close(self::db());
	    self::$link = NULL;
	}
    }

    /**
     * 执行一条SQL语句
     * 用法：query(SQL语句) 
     * @param string  $sql          要执行的语句
     * @return boolean		    如果成功返回真，如果失败，返回假
     */
    public static function query($sql)
    {
	if(DB_DEBUG == 1)
	{
	    echo $sql.'<hr>';
	}
	$query = mysql_query($sql, self::db());
        return $query;
    }

    /**
     * [提倡]用数组类型插入数据纪录 
     * 用法：insert('t_user', array('u_uid' => 1, 'u_uname' => 'admin', 'u_flag' => 1));
     *
     * @param $table		表名
     * @param $arrayValue	要插入的数值的数组：例如：array('u_uid' => 1, 'u_uname' => 'admin', 'u_flag' => 1)
     * @return boolean		如果成功返回真，如果失败，返回假 
     *
     */
    public static function insert($table, $arrayValue)
    {
	$arrFields = array();
	$arrValues = array();
	foreach ($arrayValue as $k => $v)
	{
	    $arrFields[] = $k;
	    if (is_string($v))
	    {
		//$arrValues[] = sprintf('\'%s\'', str_replace('\'', '\'\'', $v));
		$arrValues[] = sprintf('\'%s\'', $v);
	    }
	    else if (is_numeric($v))
	    {
		$arrValues[] = sprintf('%s', $v);
	    }
	    else if (is_null($v))
	    {
		$arrValues[] = 'NULL';
	    }
	    else
	    {
		//throw new Exception('Error Field Type');
	    }
	}
	$sql  = sprintf('INSERT INTO %s (%s) VALUES(%s)', $table, implode(',', $arrFields), implode(',', $arrValues));
	return self::query($sql);
    }

    /**
     * [提倡]用二维数组类型插入多条数据纪录
     * 用法：insertLot('t_user', array(0 => array('u_uid' => 1, 
     *		    'u_uname' => 'admin'), 1 => array('u_uid' => 2, 
     *		    'u_uname' => 'supfire')));
     *
     * @param $table    表名
     * @param $insert   要插入的数据字段名集合
     * @param $value    要插入的数据数值集合 
     *			例如：array(0 => array('u_uid' => 1, 
     *			    'u_uname' => 'admin'), 1 => array('u_uid' => 2, 
     *			    'u_uname' => 'supfire'))
     *		    
     * @return boolean  如果成功返回真，如果失败，返回假 
     *
     */
    public static function insertLot($table, $arrayvalue)
    {
	if(!$arrayvalue || !$table) { return ;}
	foreach ($arrayvalue as $key => $item)
	{
	    unset($arrValues);
	    foreach ($item as $k => $v)
	    {
		if (is_string($v))
		{
		    //$arrValues[] = sprintf('\'%s\'', str_replace('\'', '\'\'', $v));
		    $arrValues[] = sprintf('\'%s\'', $v);
		}
		else if (is_numeric($v))
		{
		    $arrValues[] = sprintf('%s', $v);
		}
		else if (is_null($v))
		{
		    $arrValues[] = 'NULL';
		}
		else
		{
		    //throw new Exception('Error Field Type');
		}
	    }
	    $Fields = implode(',', array_keys($item));
	    $values .= '(' . implode(',', $arrValues) . '),';
	}
	$values = substr($values, 0, -1);
	$sql  = sprintf('INSERT INTO %s (%s) VALUES %s', $table, $Fields, $values);
	return self::query($sql);
    }

    /**
     * [提倡]更新数据纪录
     * 用法：update('t_user', array('u_uname' => 'admin', 'u_flag' => 1), 'u_uid = 1');
     *
     * @param $table         表名
     * @param $arrayValue    要更新的数据字段名的数组：例如：array('u_uname' => 'admin', 'u_flag' => 1)
     * @param $whereSql      要更新的数据时的条件：例如：'u_uid = 1'
     * @return int	     如果成功返回影响的行数，如果失败，返回假 
     *
     */
    public static function update($table, $arrayValue, $whereSql = 1)
    {
	foreach ($arrayValue as $k => $v)
	{
	    if (is_string($v))
	    {
		$a = sprintf('\'%s\'', $v);
		//$a = sprintf('\'%s\'', str_replace('\'', '\'\'', $v));
	    }
	    else if (is_numeric($v))
	    {
		$a = sprintf('%s', $v);
	    }
	    else if (is_null($v))
	    {
		$a = 'NULL';
	    }
	    else
	    {
		//throw new Exception('Error Field Type');
	    }
	    $arr[] = $k . ' = ' . $a;
	}
	$sql  = sprintf('UPDATE %s SET %s WHERE %s', $table, implode(',', $arr), $whereSql);
	self::query($sql);
	return mysql_affected_rows(self::db());
    }

     /**
     * [提倡] 尝试先更新记录，如果没有此条记录，则插入记录。
     *  
     * 方法：replace('t_user', array('u_uname' => 'admin', 'u_flag' => 1), 'u_uid = 1');
     *
     * @param $table         表名
     * @param $arrayValue    要更新的数据字段名的数组：例如：array('u_uname' => 'admin', 'u_flag' => 1)
     * @param $whereSql      要更新的数据时的条件：例如：'u_uid = 1'
     * @return int	     如果失败，返回false，如果更新成功返回影响的行数，如果插入成功返回2
     *                                        
     */
    public static function replace($table, $arrayValue, $whereSql = 1)
    {
	$key =  key($arrayValue);
	$rs = self::getOne($table, $key, $whereSql);
	if($rs)
	{
	    return self::update($table, $arrayValue, $whereSql);
	}
	else
	{
	    $action = self::insert($table, $arrayValue);
	    if($action) {return 2;}
	}
	return false;
    }

    /**
     * 删除纪录 
     * 用法：deleteRs($table, $whereSql = 1)
     * @param $TABLE    表名
     * @param $WHERE    条件
     * @return int	如果成功返回影响的行数，如果失败，返回假
     */
    public static function deleteRs($table, $whereSql = 1)
    {
	self::query('DELETE FROM '.$table.' WHERE '.$whereSql);
	return mysql_affected_rows(self::db());
    }

    /**
     * 查询记录条数
     * 用法：getCount($table, $key, $whereSql = 1)
     * @param $key          被查询字段名
     * @param $table        表名
     * @param $whereSql     条件
     * @return int	    总记录条数
     */
    public static function getCount($table, $key, $whereSql = 1)
    {
        $rs = self::query('SELECT COUNT('.$key.') AS num FROM '.$table.'
	         WHERE '.$whereSql.' limit 1');
        $rs = self::rowArray($rs);
        return $rs[0];
    }

    /**
     * 特定条件查询一条记录中的特定的单个记录
     * 用法：getOne($table, $key, $whereSql = 1)
     * @param string $table             要查询的表名
     * @param string  $key              要查询的字段名
     * @return string			单个记录
     */
    public static function getOne($table, $key, $whereSql = 1)
    {
        $rs = self::query('SELECT '.$key.' FROM '.$table.' WHERE '.$whereSql.' limit 1');
	    $rs = self::rowArray($rs);
        return $rs[0];
    }

    /**
     * 特定条件查询某表第一行内容记录
     * 用法：getRow($table, $field = '*', $whereSql = 1)
     * @param string $table             要查询的表名
     * @param string  $whereSql         查询的特定条件
     * @return array			一行记录
     */
    public static function getRow($table, $field = '*', $whereSql = 1)
    {
        $rs = self::query('SELECT '.$field.' FROM '.$table.' WHERE '.$whereSql.' limit 1');
        $rsList = array();
        if ($rs)
        {
            while ($row = mysql_fetch_assoc($rs))
	    {
		$rsList[] = $row;
	    }
	    mysql_free_result($rs);
	}
        return $rsList[0];
    }

    /**
     * 特定条件查询某表全部记录
     * 用法：getAll($table, $field = '*', $whereSql = 1)
     * @param string  $table            要查询的表名
     * @param string  $field            查询的字段
     * @param string  $whereSql         查询的特定条件
     * @return array			全部记录
     */
    public static function getAll($table, $field = '*', $whereSql = 1)
    {
        $rs = self::query('SELECT '.$field.' FROM '.$table.' WHERE '. $whereSql);
        $rsList = array();
        if ($rs)
        {
            while ($row = mysql_fetch_assoc($rs))
            {
		$rsList[] = $row;
	    }
            mysql_free_result($rs);
        }
        return $rsList;
    }

    /**
     * 特定条件查询某表一列记录
     * 用法：getCol($table, $key, $whereSql = 1)
     * @param string  $table        要查询的表名
     * @param string  $where        查询的特定条件
     * @return array		    一列记录
     */
    public static function getCol($table, $key, $whereSql = 1)
    {
        $rs = self::query('SELECT '.$key.' FROM '.$table.' WHERE '. $whereSql);
        $rsList = array();
        if ($rs)
        {
            while ($row = mysql_fetch_assoc($rs))
            {
		$rsList[] = $row[$key];
	    }
            mysql_free_result($rs);
        }
        return $rsList;
    }

    /**
     * 去除重复 [重复算一条数据]，查询某条件下数据总数
     * 用法：getDistinctCount($table, $key, $whereSql = 1)
     * @param $key          被查询字段名
     * @param $table        表名
     * @param $whereSql     条件
     * @return int	    总记录条数
     */
    public static function getDistinctCount($table, $key, $whereSql = 1)
    {
        $rs = self::query('SELECT COUNT(DISTINCT '.$key.') FROM '.$table.'
	         WHERE '.$whereSql.' limit 1');
        $rs = self::rowArray($rs);
        return $rs[0];
    }
    
    /**
     * 查询多条条记录 
     * 用法：getLimit($table, $field = '*', $whereSql = 1, $startpage = 0, $per = -1)
     * @param string  $table		要查询的表名
     * @param string  $field		要查询的字段名
     * @param string  $startpage	开始查询页数
     * @param string  $per		数据偏移量
     * @return array			查询结果数组
     */
    public static function getLimit($table, $field = '*', $whereSql = 1, $startpage = 0, $per = -1)
    {
	
	$start = ($startpage - 1) * $per > 0 ? ($startpage - 1) * $per : 0;
	if($per > 0)
	{
	    $LIMIT = ' LIMIT '.$start.','.$per;
	}
	$rs = self::query('SELECT ' . $field . ' FROM '. $table .' WHERE ' . $whereSql . $LIMIT);
	unset($LIMIT);
        $rsList = array();
        if ($rs)
        {
	    while ($row = mysql_fetch_assoc($rs))
	    {
		$rsList[] = $row;
	    }
	    mysql_free_result($rs);
	}
        return $rsList;
    }

    /**
     * 联合查询两个数据表特定记录
     * 用法：getLeftJoin($tableA, $tableB, $field = '*', $onSql, $whereSql = 1, $startpage = -1, $per = -1)
     * @param string  $tableA $tableB  要查询的表名
     * @param string  $field           查询的字段 例如：a.username, b.userid, b.name
     * @param string  $onSql           两表ON的条件语句 例如：a.userid = b.userid
     * @param string  $whereSql        查询的特定条件
     * @param string  $per	       偏移量
     * @param string  $startpage       开始查询页数
     * @return array		       查询结果数组	
     */
    public static function getLeftJoin($tableA, $tableB, $field = '*', $onSql, $whereSql = 1, $startpage = -1, $per = -1)
    {
	$start = ($startpage - 1) * $per > 0 ? ($startpage - 1) * $per : 0;
	if($per > 0)
	{
	    $LIMIT = ' LIMIT '.$start.','.$per;
	}
	$rs = self::query('SELECT '.$field.' FROM '.$tableA.' a LEFT JOIN '.$tableB.' b ON '.$onSql.'
	    WHERE ' . $whereSql . $LIMIT);
        $rsList = array();
        if ($rs)
        {
            while ($row = mysql_fetch_assoc($rs))
	    {
		$rsList[] = $row;
	    }
            mysql_free_result($rs);
	}
        return $rsList;
    }     

    /**
     * 联合查询两个数据表数据总数
     * 用法：getLeftJoinCount($tableA, $tableB, $key = '*', $onSql, $whereSql = 1)
     * @param string  $tableA $tableB  要查询的表名
     * @param string  $field           查询的字段 例如：a.username, b.userid, b.name
     * @param string  $onSql           两表ON的条件语句 例如：a.userid = b.userid
     * @param string  $whereSql        查询的特定条件
     * @return mun		       总记录条数
     */
    public static function getLeftJoinCount($tableA, $tableB, $key = '*', $onSql, $whereSql = 1)
    {
	$rs = self::query('SELECT COUNT('.$key.') AS num FROM '.$tableA.' a LEFT JOIN '.$tableB.' b ON '.$onSql.'
	        WHERE ' . $whereSql);
        $rs = self::rowArray($rs);
        return $rs[0];
    }      

    /**
     * 联合查询三个数据表特定记录
     * 用法：LeftJoinThree($tableA, $tableB, $tableC, $field = '*', $onAB, $onBC, $whereSql = 1, $startpage = 0, $per = -1)
     * @param string  $tableA $tableB  $tableC 要查询的表名
     * @param string  $field			查询的字段 例如：a.username, b.userid, b.name
     * @param string  $onAB			AB两表ON的条件语句 例如：a.userid = b.userid
     * @param string  $onBC			BC两表ON的条件语句 例如：b.userid = c.userid
     * @param string  $whereSql			查询的特定条件
     * @param string  $startpage		开始查询页数
     * @param string  $per			数据偏移量
     * @return array				查询结果数组
     */
    public static function LeftJoinThree($tableA, $tableB, $tableC, $field = '*', $onAB, $onBC, $whereSql = 1, $startpage = 0, $per = -1)
    {
	$start = ($startpage - 1) * $per > 0 ? ($startpage - 1) * $per : 0;
	if($per > 0)
	{
	    $LIMIT = ' LIMIT '.$start.','.$per;
	}
	$rs = self::query('SELECT '.$field.' FROM '.$tableA.' a 
	    LEFT JOIN '.$tableB.' b ON '.$onAB.'
	    LEFT JOIN '.$tableC.' c ON '.$onBC.'
	    WHERE ' . $whereSql . $LIMIT);
        $rsList = array();
        if ($rs)
        {
            while ($row = mysql_fetch_assoc($rs))
	    {
		$rsList[] = $row;
	    }
            mysql_free_result($rs);
	}
        return $rsList;
    }     

    /**
     * 联合查询三个数据表的数据总数
     * 用法：LeftJoinThreeCount($tableA, $tableB, $key = '*', $onSql, $whereSql = 1)
     * @param string  $tableA $tableB  $tableC 要查询的表名
     * @param string  $field			查询的字段 例如：a.username, b.userid, b.name
     * @param string  $onAB			AB两表ON的条件语句 例如：a.userid = b.userid
     * @param string  $onBC			BC两表ON的条件语句 例如：b.userid = c.userid
     * @param string  $whereSql			查询的特定条件
     * @return int    总记录条数
     */
    public static function LeftJoinThreeCount($tableA, $tableB, $tableC, $key = '*', $onAB, $onBC, $whereSql = 1)
    {
	$rs = self::query('SELECT COUNT('.$key.') AS num FROM '.$tableA.' a 
	    LEFT JOIN '.$tableB.' b ON '.$onAB.'
	    LEFT JOIN '.$tableC.' c ON '.$onBC.'
	        WHERE ' . $whereSql);
        $rs = self::rowArray($rs);
        return $rs[0];
    }      

    /**
     * 用数组的方法联合查询数据表特定记录
     * 用法：LeftJoinArr(
     *		    array( 
     *			    0 => array('t_user' => 'u_userid', 't_member' => 'm_userid'), 
     *			    1 => array('t_user' => 'u_userid', 't_friend' => 'f_userid')
     *			  ), 
     *			  't_user.username, t_friend.email, t_member.birth', $whereSql, $startpage, $per);
     *
     * @param string  $arrayValue	二维数组表示各个表以及表与表之间的关系，如上所示。
     * @param string  $field		查询的字段 例如：t_user.username, t_user.userid, t_member.birth
     * @param string  $startpage	开始查询页数
     * @param string  $per		数据偏移量
     * @param string  $whereSql		查询的特定条件
     * @return array			查询结果数组
     */
    public static function LeftJoinArr($arrayValue, $field = '*', $whereSql = 1, $startpage = 0, $per = -1)
    {
	$start = ($startpage - 1) * $per > 0 ? ($startpage - 1) * $per : 0;
	if($per > 0)
	{
	    $LIMIT = ' LIMIT '.$start.','.$per;
	}
	foreach ($arrayValue as $key => $item)
	{
	    $keyarr = array_keys($item);
	    $a = $keyarr[0];
	    $b = $keyarr[1];

	    if(!$key)
	    {
		$sql = 'SELECT '.$field.' FROM '.$a.' AS '.$a;
	    }
	    $sql .= ' LEFT JOIN '.$b.' AS '.$b.' ON '.$a.'.'.$item[$a].' = '.$b.'.'.$item[$b];
	}
	$rs = self::query($sql.' WHERE ' . $whereSql . $LIMIT);
        $rsList = array();
        if ($rs)
        {
            while ($row = mysql_fetch_assoc($rs))
	    {
		$rsList[] = $row;
	    }
            mysql_free_result($rs);
	}
        return $rsList;
    }     

    /**
     * 特定条件查询三个数据表的数据总数
     * 用法：LeftJoinArrCountarray( 
     *			    0 => array('t_user' => 'u_userid', 't_member' => 'm_userid'), 
     *			    1 => array('t_user' => 'u_userid', 't_friend' => 'f_userid')
     *			  ), $whereSql);
     *	
     * @param string  $arrayValue	二维数组表示各个表以及表与表之间的关系，如上所示
     * @param string  $whereSql		查询的特定条件
     * @return array			查询结果数组
     * @return int    总记录条数    
     */
    public static function LeftJoinArrCount($arrayValue, $whereSql = 1)
    {

	foreach ($arrayValue as $key => $item)
	{
	    $keyarr = array_keys($item);
	    $a = $keyarr[0];
	    $b = $keyarr[1];

	    if(!$key)
	    {
		$sql = 'SELECT COUNT('.$a.'.'.$item[$a].') AS num FROM '.$a.' AS '.$a;
	    }
	    $sql .= ' LEFT JOIN '.$b.' AS '.$b.' ON '.$a.'.'.$item[$a].' = '.$b.'.'.$item[$b];
	}	
	
	$rs = self::query($sql . ' WHERE ' . $whereSql);
        $rs = self::rowArray($rs);
        return $rs[0];
    }      

    /**
     * 用数组的方法联合查询数据表特定记录
     * 用法：LeftJoinArrMinCount(
     *		    array( 
     *			    0 => array('t_user' => 'u_userid', 't_member' => 'm_userid'), 
     *			    1 => array('t_user' => 'u_userid', 't_friend' => 'f_userid')
     *			  ), 
     *			  't_user.username, t_friend.email, t_member.birth', $whereSql, $startpage, $per);
     *
     * @param string  $arrayValue	二维数组表示各个表以及表与表之间的关系，如上所示。
     * @param string  $field		查询的字段 例如：t_user.username, t_user.userid, t_member.birth
     * @param string  $distinct		需要去重复的字段
     * @param string  $startpage	开始查询页数
     * @param string  $per		数据偏移量
     * @param string  $whereSql		查询的特定条件
     * @return array			查询结果数组
     */
    public static function LeftJoinMinArr($arrayValue, $min, $field = '*', $whereSql = 1, $startpage = 0, $per = -1)
    {
	$start = ($startpage - 1) * $per > 0 ? ($startpage - 1) * $per : 0;
	if($per > 0)
	{
	    $LIMIT = ' LIMIT '.$start.','.$per;
	}
	foreach ($arrayValue as $key => $item)
	{
	    $keyarr = array_keys($item);
	    $a = $keyarr[0];
	    $b = $keyarr[1];

	    if(!$key)
	    {
		$sql = 'SELECT min('.$min.'), '.$field.' FROM '.$a.' AS '.$a;
	    }
	    $sql .= ' LEFT JOIN '.$b.' AS '.$b.' ON '.$a.'.'.$item[$a].' = '.$b.'.'.$item[$b];
	}
	$rs = self::query($sql.' WHERE ' . $whereSql. ' GROUP BY '.$min. ' ' . $LIMIT);
        $rsList = array();
        if ($rs)
        {
            while ($row = mysql_fetch_assoc($rs))
	    {
		$rsList[] = $row;
	    }
            mysql_free_result($rs);
	}
        return $rsList;
    }     

    /**
     * 特定条件查询三个数据表的数据总数
     * 用法：LeftJoinArrCountarray( 
     *			    0 => array('t_user' => 'u_userid', 't_member' => 'm_userid'), 
     *			    1 => array('t_user' => 'u_userid', 't_friend' => 'f_userid')
     *			  ), $whereSql);
     *	
     * @param string  $arrayValue	二维数组表示各个表以及表与表之间的关系，如上所示
     * @param string  $distinct		需要去重复的字段
     * @param string  $whereSql		查询的特定条件
     * @return array			查询结果数组
     * @return int    总记录条数    
     */
    public static function LeftJoinArrDistinctCount($arrayValue, $distinct, $whereSql = 1)
    {

	foreach ($arrayValue as $key => $item)
	{
	    $keyarr = array_keys($item);
	    $a = $keyarr[0];
	    $b = $keyarr[1];

	    if(!$key)
	    {
		$sql = 'SELECT COUNT(DISTINCT '.$distinct.') AS num FROM '.$a.' AS '.$a;
	    }
	    $sql .= ' LEFT JOIN '.$b.' AS '.$b.' ON '.$a.'.'.$item[$a].' = '.$b.'.'.$item[$b];
	}	
	
	$rs = self::query($sql . ' WHERE ' . $whereSql);
        $rs = self::rowArray($rs);
        return $rs[0];
    }      

    /**
     * 自行验证安全性插入数据纪录 
     * 用法：insert('t_user', 'u_uid, u_uname, u_flag', '1, admin, 1');
     * @param $table    表名
     * @param $insert   要插入的数据字段名集合：例如：uid, username, roles
     * @param $value    要插入的数据数值集合：例如：1,2,3
     * @return int	如果成功返回真，如果失败，返回假，    
     *
     */
    public static function insertRs($table, $insert, $value)
    {
     	return self::query('INSERT INTO '.$table.'( ' . $insert . ' )
	         VALUES( ' . $value . ' )');
    }

    /**
     * 自行验证安全性用字符串插入多条数据纪录
     * 用法：insertLot('t_user', 'u_uid, u_uname', '(1,\'admin\'),(2,\'supfire\')');
     *
     * @param $table    表名
     * @param $insert   要插入的数据字段名集合：例如：uid, username
     * @param $value    要插入的数据数值集合：例如：(1,'admin'),(2,'supfire')
     * @return boolean  如果成功返回真，如果失败，返回假
     *
     */
    public static function insertLotRs($table, $insert, $value)
    {
     	return self::query('INSERT INTO '.$table.'( ' . $insert . ' )
	         VALUES' . $value);
    }

    /**
     * 自行验证安全性更新数据纪录 
     * 用法：updateRs($table, $set, $whereSql = 1)
     * @param $set      要更新的数据字段名
     * @param $table    表名
     * @param $where    条件
     * @return boolean  如果成功返回真，如果失败，返回假 
     */
    public static function updateRs($table, $set, $whereSql = 1)
    {
	self::query('UPDATE '.$table.' SET '.$set.'  WHERE '.$whereSql);
	return mysql_affected_rows(self::db());
    }

    /**
     * 自行验证安全性尝试先更新记录，如果没有此条记录，则插入记录。
     * 用法：replaceRs($table, $field, $value, $whereSql = 1, $key = '')
     *     注意: $key为空时，$field第一个值不为空时，才能使用此函数.
     *  使用方法：db::replaceRs('sns_user_basic', 'enname,username,userpass,email',
     *                         '"supfire","li bing","mima","1@123.email"', 'userid = 1001');
     * @param string $table                   要查询操作的数据表
     * @param array $field                    要查询操作的字段值 
     *                                        例如："userid, username, email"
     * @param string $value                   主键字段 or 列表   
     *                                        例如："1003, username, email"
     * @param string $whereSql                要查询操作的条件
     * @param string $key                     要查询操作的索引关键字 
     *                                        例如："userid"
     * @return int                            如果失败，返回0，
     *                                        如果更新成功返回1，如果插入成功返回2
     */
    public static function replaceRs($table, $field, $value, $whereSql = 1, $key = '')
    {
	$fieldArr = explode(",", $field);
	!$key && $key = $fieldArr[0];
	$rs = self::getOne($table, $key, $whereSql);
	if($rs)
	{
	    $set = '';
	    $valueArr = explode(",", $value);
	    $i = 0;
	    foreach ($fieldArr as $field)
	    {
		$j = 0;
		foreach ($valueArr as $value)
		{
		    if($i == $j) {$set .= $field . ' = ' . $value;}
		    $j++;
		}
		$set .= ',';
		$i++;
	    }
	    $set = substr($set,0, -1);
	    unset($fieldArr);
	    unset($valueArr);
	    unset($value);
	    unset($field);
	    unset($i);
	    unset($j);
	    $action = self::updateRs($table, $set, $whereSql);
	    return $action;
	}
	else
	{
	    $action = self::insertRs($table, $field, $value);
	    if($action) {return 2;}
	}
	return $action;
    }

    /**
     * 返回上次插入记录所产生的主键ID
     *
     * @return int
     */
    public static function insertID()
    {
        return mysql_insert_id(self::db());
    }
   
    /**
     * 返回上次操作数据库所影响的行数
     *
     * @return int
     */
    public static function affectedRows()
    {
        return mysql_affected_rows(self::db());
    }
    /**
     * 从结果集中取得一行作为关联数组，或数字数组，或二者兼有
     *
     * @return array
     */
    public static function fetchArray($rs)
    {
	if($rs)
	{
	    return mysql_fetch_array($rs);
	}
	else
	{
	    return array();
	}
    }
	
    /**
     * 从结果集中取得一行作为数字数组
     *
     * @return array
     */
    public static function rowArray($rs)
    {
	if($rs)
	{
	    return mysql_fetch_row($rs);
	}
	else
	{
	    return array();
	}
    }
	
    /**
     * 从结果集中取得一行作为关联数组
     *
     * @return array
     */
    public static function fetchAssoc($rs)
    {
        return mysql_fetch_assoc($rs);
    }

    /**
     * 取得结果数据
     * //推荐使用其他高性能的替代函数
     * @return string 返回 MySQL 结果集中一个单元的内容。
     *               字段参数可以是字段的偏移量或者字段名，
     *               或者是字段表点字段名
     */
    public static function result($rs, $row)
    {
	return @mysql_result($rs, $row);
    }
    /**
     * 取得结果集中行的数目
     *
     * @return int 返回结果集中行的数目。此命令仅对 SELECT 语句有效
     */
    public static function numRows($rs)
    {
	return mysql_num_rows($rs);
    }
    /**
     * 取得结果集中字段的数目
     *
     * @return int 返回结果集中字段的数目
     */
    public static function num_fields($rs)
    {
	return mysql_num_fields($rs);
    }
    /**
     * 释放结果内存
     *
     * @return NULL 
     */
    public static function freeResult($rs)
    {
        mysql_free_result($rs);
    }
}
?>
